/**
* \file Joueur.cpp
* \brief Ensemble des methodes de la classe Joueur
* \author FEKI Mehdi && RIPOCHE Emilien
* \version 1.0
* \date 04/12/2011
*/

#include <iostream>
#include "Vaisseau.h"
#include "Joueur.h"

using namespace std;

Joueur::Joueur() 
	: _nom(""), _nbArtefacts(0), _idxFlotteCourante(0) {_flottes = vector<Flotte*>();}


Joueur::Joueur(string nom, string flotte)
	: _nom(nom), _nbArtefacts(0), _idxFlotteCourante(0) {
	//cout << "Joueur(n,f)" << endl;
	// Creation d'un vecteur de flotte
	_flottes = vector<Flotte*>();
	// Ajout d'une flotte
	_flottes.push_back(new Flotte(Flotte::stringToCouleurFlotte(flotte)));
}

Joueur::Joueur(string nom, string flotte1, string flotte2) 
	: _nom(nom), _nbArtefacts(0), _idxFlotteCourante(0) {
	//cout << "Joueur(n,f1,f2)" << endl;
	// Creation d'un vecteur de flotte
	_flottes = vector<Flotte*>();
	// Ajout des deux flottes flotte
	_flottes.push_back(new Flotte(Flotte::stringToCouleurFlotte(flotte1)));
	_flottes.push_back(new Flotte(Flotte::stringToCouleurFlotte(flotte2)));
}


void Joueur::addFlotte(Flotte::CouleurFlotte c) {
	Flotte* f = new Flotte(c);
	_flottes.push_back(f);
}

vector<unsigned int> Joueur::lancerDe() const {
	vector<unsigned int> res;
	Vaisseau::TypeVaisseau type = getFlotteCourante()->getVaisseau()->type();
	switch(type) {
	case(Vaisseau::VaisseauMere):
		{
			unsigned int jet1 = Utilitaire::getSingletonUtilitaire()->lancerDe();
			unsigned int jet2 = Utilitaire::getSingletonUtilitaire()->lancerDe();
			unsigned int som = jet1+jet2;
			res.push_back(jet1);
			res.push_back(jet2);
			res.push_back(som);
			break;
		}
	default:
		res.push_back(Utilitaire::getSingletonUtilitaire()->lancerDe());
		break;
	}
	return res;
}


void Joueur::flotteSuivante() { 
	_idxFlotteCourante = (++_idxFlotteCourante)%getNbFlottes();
};

unsigned int Joueur::getNbFlottes() const {
	return _flottes.size(); 
}

void Joueur::setXFLotte(int flotte, int x) {
	this->_flottes[flotte]->setX(x);
}
	
void Joueur::setYFlotte(int flotte, int y) {
		this->_flottes[flotte]->setY(y);
}

int Joueur::getXFlotte(int flotte) const {
	return this->_flottes[flotte]->getX();
}

int Joueur::getYFlotte(int flotte) const {
	return this->_flottes[flotte]->getY();
}

void Joueur::setPositionFlotte(int flotte, int x, int y) {
	this->setXFLotte(flotte, x);
	this->setYFlotte(flotte, y);
}

int Joueur::getIndiceFlotteCourante() const {
	return this->_idxFlotteCourante;
}

Flotte* Joueur::getFlotte(int x, int y) {
	cout << "Joueur::getFlotte(" << x  << "," << y << ")" << endl;
	for (int i = 0; i < this->_flottes.size(); i++) {
		cout << "i = " << i << endl;
		if(this->_flottes[i]->hasVaisseau(x,y)) {
			return this->_flottes[i];
		}
	}
	return NULL;
}

bool Joueur::hasCouleurFlotte(Flotte::CouleurFlotte cf) {
	for (int i =0; i < _flottes.size(); i++) {
		if(_flottes[i]->getCouleurFlotte() == cf) {
			return true;
		}
	}
	return false;
}

int Joueur::getIndiceFlotteTouche(Flotte::CouleurFlotte cf) {
	for (int i =0; i < _flottes.size(); i++) {
		if(_flottes[i]->getCouleurFlotte() == cf) {
			return i;
		}
	}
}

/*
int main() {
	Joueur* j1 = new Joueur();
	j1->setNom("j1");
	j1->addFlotte(Flotte::Rouge);

	Joueur* j2 = new Joueur("j2", "Vert");

	vector<string> flottesJ3;
	flottesJ3.push_back("Bleu");
	flottesJ3.push_back("Jaune");
	Joueur* j3 = new Joueur("j3", flottesJ3);

	cout << j1->getNom() << " : " << j1->getNbFlottes()
		<< " flottes" << endl;;
	cout << j2->getNom() << " : " << j2->getNbFlottes()
		<< " flottes" << endl;;
	cout << j3->getNom() << " : " << j3->getNbFlottes()
		<< " flottes" << endl;;
	
	system("pause");
	return 0;
}
*/
